/**
 * @file 字符串相关api
 */

import { isString, isEmpty } from './types'

/**
 * 使用符号遮蔽指定位置的字符串
 * @param {string} str 需要处理的字符串
 * @param {number} start 起始位置index
 * @param {number} end 结束位置index
 * @param {string} _mask 要替换成的字符，默认为 *
 * @returns {string} 返回遮蔽后的字符串
 *
 * @example
 * mask('12398765432', 3, 7) // => "123****5432"
 * mask('12398765432', 3, 7, '-') // => "123----5432"
 */
export const mask = (str: string, start = 0, end = 0, _mask = '*'): string => {
  let reg = new RegExp(
    `\^\(\.\{${start}\}\)\(\.\{${end - start}\}\)\(\.${end >= str.length ? '?' : '+'}\)\$`
  )
  return str.replace(reg, (_$0, $1, $2, $3) => $1 + $2.replace(/./g, _mask) + $3)
}

/**
 * 使用符号遮蔽从最左边到指定位置（从左往右）的字符串
 * @param {string} str
 * @param {number} end 结束位置（从左往右）
 * @param {string} _mask 要替换成的字符，默认为 *
 * @returns {string} 返回遮蔽后的字符串
 *
 * @example
 * maskLeft('12398765432', 3, '-') // "---98765432"
 */
export const maskLeft = (str: string, end = 0, _mask = '*'): string => mask(str, 0, end, _mask)

/**
 * 使用符号遮蔽从最右边到指定位置（从右往左）的字符串
 * @param {string} str
 * @param {number} end 结束位置（从右边起）
 * @param {string} _mask 要替换成的字符，默认为 *
 * @returns {string} 返回遮蔽后的字符串
 *
 * @example
 * maskRight('12398765432', 3, '-') // => "12398765---"
 */
export const maskRight = (str: string, end = 0, _mask = '*'): string => {
  let strLenth = str.length
  return mask(str, end > strLenth ? 0 : strLenth - end, strLenth, _mask)
}

/**
 * 去除字符串所有空格
 * @param {string} str
 * @returns {string} 返回 去除后的字符串
 *
 * @example
 * removeStringSpace('       good        ') // => 'good'
 * removeStringSpace('       b  a  d        ') // => 'bad'
 */
export const removeStringSpace = (str: string): string => {
  if (isEmpty(str)) {
    return ''
  }

  if (isString(str)) {
    return str.replace(/\s+/g, '')
  }

  return ''
}
